home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Suzy B Software 2
/
Suzy B Software CD-ROM 2 (1994).iso
/
extras
/
programm
/
gemfsc20
/
gemfsc20.lzh
/
GEMFUNCS
/
FRMEFLAG.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-20
|
8KB
|
233 lines
/*****************************************************************************
*
****************************************************************************/
#include "gemfintl.h"
#include <osbind.h>
static char GFAR cant_flagit_alert[] = "[3]"
"[An error has occured with an"
"|item you selected or modified."
"|There are not enough system"
"|resources to flag the object"
"|and display the error message."
"][ Continue ]"
;
static OBJECT GFAR msgtree[] = {
-1, 1, 1, G_BOX, NONE, SHADOWED, (_Ob_spec_t)0x00FF2100L, 0, 0, 0, 0,
0, 2, 21, G_BOX, NONE, NORMAL, (_Ob_spec_t)0x00000000L, 1, 0, 0, 0,
3, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0, 0, 0, 1,
4, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0, 1, 0, 1,
5, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0, 2, 0, 1,
6, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0, 3, 0, 1,
7, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0, 4, 0, 1,
8, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0, 5, 0, 1,
9, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0, 6, 0, 1,
10, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0, 7, 0, 1,
11, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0, 8, 0, 1,
12, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0, 9, 0, 1,
13, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0,10, 0, 1,
14, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0,11, 0, 1,
15, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0,12, 0, 1,
16, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0,13, 0, 1,
17, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0,14, 0, 1,
18, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0,15, 0, 1,
19, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0,16, 0, 1,
20, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0,17, 0, 1,
21, -1, -1, G_TEXT, NONE, NORMAL, (_Ob_spec_t)0L, 0,18, 0, 1,
1, -1, -1, G_TEXT, LASTOB, NORMAL, (_Ob_spec_t)0L, 0,19, 0, 1,
};
#define TEXT_BOX 1
#define FIRST_TEXT_LINE 2
/**************************************************************************
* treeplace - Figure out a good place to hang the text box on the screen.
*************************************************************************/
#ifdef GEMFAST_PROTOS
static void treeplace(register OBJECT *ptree, register VRECT *vdirect)
#else
static void treeplace(ptree, vdirect)
register OBJECT *ptree;
register VRECT *vdirect;
#endif
{
register short wrkint1, wrkint2, wrkint3;
wrkint1 = vdirect->v_y1;
wrkint2 = gl_vwout[1] - vdirect->v_y2;
wrkint3 = ptree->ob_height + gl_hchar + 1;
if (wrkint1 > wrkint2) {
ptree->ob_y = wrkint1 - wrkint3; /* place above object */
} else {
ptree->ob_y = vdirect->v_y2 + gl_hchar; /* place below object */
}
wrkint1 = vdirect->v_x1;
wrkint2 = gl_vwout[0] - vdirect->v_x2;
wrkint3 = ptree->ob_width + gl_wchar + 1;
if (wrkint1 > wrkint2) {
ptree->ob_x = wrkint1 - wrkint3;
} else {
ptree->ob_x = vdirect->v_x2 + gl_wchar;
}
frm_confine(ptree, &gl_rwdesk);
}
/**************************************************************************
*
* frm_eflag - Flag an erronious object.
*
*************************************************************************/
#ifdef GEMFAST_PROTOS
short frm_eflag(OBJECT *ptree, short obj, char *fmt, ...)
#else
short frm_eflag(ptree, obj, fmt)
OBJECT *ptree;
short obj;
char *fmt;
#endif
{
va_list args;
short vdi_handle;
short maxwidth = 0;
short numlines;
short msglen;
void *blitbuffer;
char *pmsgtext;
char *msglines[FRM_DSMAXSTRINGS+1];
GRECT flagrect;
GRECT msgrect;
GRECT saverect;
VRECT flagbox;
XMULTI xm;
short status;
static short initdone = FALSE;
/*----------------------------------------------------------------------
* Start by ringing the user's bell <snicker>. Believe it or not,
* doing this first helps hide the fact that it takes about 1/4 second
* to get the error display up on the screen. (Don't ask me why, do
* I look like a psychologist or something?)
*--------------------------------------------------------------------*/
Bconout(2,'\007'); /* ding... */
if (!initdone) {
initdone = TRUE;
rsc_treefix(msgtree);
msgtree[TEXT_BOX].ob_y = gl_hchar / 2;
}
if (0 == (vdi_handle = apl_vshared())) {
status = gfErr_vdi_handle;
goto ERROR_EXIT;
}
/*----------------------------------------------------------------------
* Calc the rectangles involved with the object to be flagged.
*--------------------------------------------------------------------*/
obj_clcalc(ptree, obj, &flagrect, NULL);
rc_gadjust(&flagrect, 5, 3);
rc_gtov(&flagrect, &flagbox);
/*----------------------------------------------------------------------
* Fix up the error message text tree. The fixup will change the
* size of the tree. Upon return, calc the location of the tree, (note
* that this process can fail, if we can't fit the text on the screen).
* Calc rectangles involved with the final placement of the text tree.
*--------------------------------------------------------------------*/
va_start(args, fmt);
pmsgtext = _FrmVFormat(fmt, args, &msglen);
va_end(args);
if (msglen < 0) {
status = msglen;
goto ERROR_EXIT;
}
_FrmNL2DS(pmsgtext, msglines, NULL, FRM_DSMAXSTRINGS);
numlines = _FrmDS2Obj(msglines, &msgtree[FIRST_TEXT_LINE], NULL,
&maxwidth, FRM_DSMAXSTRINGS);
_FrmTrWidths(msgtree, TEXT_BOX, gl_wchar * maxwidth);
msgtree[TEXT_BOX].ob_height = gl_hchar * numlines;
msgtree[ROOT].ob_width = gl_wchar * (maxwidth + 2);
msgtree[ROOT].ob_height = gl_hchar * (numlines + 1);
treeplace(msgtree, &flagbox);
obj_clcalc(msgtree, ROOT, &msgrect, NULL);
rc_copy(&msgrect, &saverect);
rc_union(&flagrect, &saverect);
rc_gadjust(&saverect, 3, 2);
/*----------------------------------------------------------------------
* Save the screen area, display the text message and flag the
* object. Wait for a button or key, upon event restore the screen.
*--------------------------------------------------------------------*/
wind_update(BEG_MCTRL);
wind_update(BEG_UPDATE);
if (NULL == (blitbuffer = grf_memblit(GRF_NORMAL, NULL, &saverect))) {
status = gfErr_no_memory;
goto ERROR_EXIT;
}
graf_mouse(M_OFF, 0L);
vsl_width(vdi_handle, 3);
vsl_color(vdi_handle, 2); /* red */
vs_clip(vdi_handle, TRUE, (short *)&gl_rfscrn);
v_rbox(vdi_handle, (short *)&flagbox); /* flag object */
vs_clip(vdi_handle, FALSE, (short *)&gl_rfscrn);
vsl_color(vdi_handle, 1);
vsl_width(vdi_handle, 1);
graf_mouse(M_ON, 0L);
objc_draw(msgtree, R_TREE, MAX_DEPTH, RECTVALS(&msgrect)); /* show text */
xm.mflags = MU_BUTTON | MU_KEYBD;
xm.mbclicks = 1;
xm.mbmask = 1;
xm.mbstate = 1;
evnx_multi(&xm);
grf_memblit(GRF_NORMAL, blitbuffer, &saverect);
if (xm.mwhich & MU_BUTTON) {
xm.mbstate = 0; /* wait for button-up */
xm.mflags = MU_BUTTON;
evnx_multi(&xm);
}
wind_update(END_UPDATE);
wind_update(END_MCTRL);
_FrmVFree(pmsgtext);
/*----------------------------------------------------------------------
* return success.
*--------------------------------------------------------------------*/
return gfSuccess;
ERROR_EXIT:
form_alert(1,cant_flagit_alert);
return status;
}